/*
Viewer for Khan Academy
Copyright (C) 2012 Concentric Sky, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.concentricsky.android.khanacademy.data.remote;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import oauth.signpost.OAuthConsumer;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import android.os.AsyncTask;
import com.concentricsky.android.khanacademy.data.db.ModelBase;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.TypeFactory;
public abstract class KAEntityCollectionFetcherTask<T extends ModelBase>
extends AsyncTask<Void, Integer, List<T>> {
// private TypeReference<List<T>> type;
// private JavaType type;
private CollectionType type;
private String url;
private OAuthConsumer consumer;
protected Exception exception;
public KAEntityCollectionFetcherTask(Class<T> type, String url) {
this.url = url;
TypeFactory f = TypeFactory.defaultInstance();
// this.type = new TypeReference<List<T>>() {};
// this.type = f.constructParametricType(ArrayList.class, type);
this.type = f.constructCollectionType(ArrayList.class, type);
}
public KAEntityCollectionFetcherTask(Class<T> type, String url, OAuthConsumer consumer) {
this(type, url);
this.consumer = consumer;
}
@Override
protected List<T> doInBackground(Void... arg0) {
// call API and fetch an entity tree (commonly the tree rooted at the root topic)
RestTemplate restTemplate = new RestTemplate();
if (consumer != null) {
restTemplate.setRequestFactory(new SpringRequestFactory(consumer));
}
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
ResponseEntity<String> result = restTemplate.getForEntity(url, String.class);
String body = result.getBody();
// String tag = "~~~~~~~~~~~~~~~~";
// Log.setLevel(tag, Log.VERBOSE);
// Log.d(tag, "result body is a " + body.getClass().getCanonicalName());
// Log.d(tag, "result is " + body);
ObjectMapper mapper = new ObjectMapper();
List<T> list = null;
try {
list = mapper.readValue(body, type);
} catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* Called with the result of the api call. Subclasses should override this
* method to handle the result. If result is null, it means the api call
* returned an unexpected object type, and the exception is available on
* this.exception.
*
* @param result The return of the api call.
*/
@Override
protected abstract void onPostExecute(List<T> result);
}